#ifndef _BSP_I2C_H
#define _BSP_I2C_H

void bsp_i2c_init(void);
#if I2C_SW_EN
void bsp_i2c_start(void);
void bsp_i2c_stop(void);
void bsp_i2c_tx_byte(uint8_t dat);
uint8_t bsp_i2c_rx_byte(void);
bool bsp_i2c_rx_ack(void);
void bsp_i2c_tx_ack(void);
void bsp_i2c_tx_nack(void);

#if IIC_TEST_EN
#define MPU6050_W_ADDR              0xD0
#define MPU6050_R_ADDR              0xD1
#define MPU6050_ADDR                0x68          //方便对齐dmp库

#define MPU6050_PWR_MAGT1           0x6B
#define MPU6050_PWR_MAGT2           0x6C
#define MPU6050_SAMPLING_DIV        0x19
#define MPU6050_CONFIG              0x1A
#define MPU6050_GYRO_CONFIG         0x1B
#define MPU6050_ACCLE_CONFIG        0x1C

#define MPU6050_ACCLE_XOUT_H        0x3B
#define MPU6050_ACCLE_XOUT_L        0x3C
#define MPU6050_ACCLE_YOUT_H        0x3D
#define MPU6050_ACCLE_YOUT_L        0x3E
#define MPU6050_ACCLE_ZOUT_H        0x3F
#define MPU6050_ACCLE_ZOUT_L        0x40

#define MPU6050_TEMP_OUT_H          0x41
#define MPU6050_TEMP_OUT_L          0x42
#define MPU6050_TEMP_PARAM          340
#define MPU6050_HUMAN_TEMP          36

#define MPU6050_GYRO_XOUT_H         0x43
#define MPU6050_GYRO_XOUT_L         0x44
#define MPU6050_GYRO_YOUT_H         0x45
#define MPU6050_GYRO_YOUT_L         0x46
#define MPU6050_GYRO_ZOUT_H         0x47
#define MPU6050_GYRO_ZOUT_L         0x48

enum MPU6050_POZITION{
    ACCLE_POZITION_X = 1,
    ACCLE_POZITION_Y,
    ACCLE_POZITION_Z,
};
uint8_t i2c_reg_read_byte(uint8_t reg_addr,bool continue_read);
void i2c_reg_write_byte(uint8_t reg_addr,uint8_t data);
void mpu6050_write_buffer(u8 reg,u8 len,u8 *buf);
u8 mpu6050_read_buffer(u8 reg,u8 len,u8 *buf);

void mpu6050_init(void);
uint16_t get_mpu6050_accl_data(u8 pozition);
uint16_t get_mpu6050_temperature(void);
uint16_t get_mpu6050_gyro_data(u8 pozition);

#endif //IIC_TEST_EN

#if MPU6050_DMP_EN

#endif

#elif I2C_HW_EN
#define DATA_CNT_1B     1
#define DATA_CNT_2B     2
#define DATA_CNT_3B     3
#define DATA_CNT_4B     4

#define START_FLAG0     BIT(3)
#define DEV_ADDR0       BIT(4)
#define REG_ADDR_0      BIT(5)
#define REG_ADDR_1      (BIT(5) | BIT(6))

#define START_FLAG1     BIT(7)
#define DEV_ADDR1       BIT(8)
#define RDATA           BIT(9)
#define WDATA           BIT(10)

#define STOP_FLAG       BIT(11)
#define NACK            BIT(12)

//i2c_cfg配置I2C数据格式：
//1、发送：[START_FLAG0]  [DEV_ADDR0] [REG_ADDR_0(REG_ADDR_1, 16位地址)] [WDATA] [STOP_FLAG] （设上WDATA）
//2、接收：[START_FLAG0]  [DEV_ADDR0] [REG_ADDR_0(REG_ADDR_1, 16位地址)] [START_FLAG1] [DEV_ADDR1] [RDATA] [STOP_FLAG]（设上RDATA）

void bsp_i2c_tx_byte(u16 dev_addr, u16 reg_addr, u32 data);
void bsp_i2c_rx_buf(u16 dev_addr, u16 reg_addr, u8 *buf, u16 len);
void bsp_i2c_init(void);
#endif
#endif
